home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / BASIC / 0156.ZIP / HIDEFILE.BAS < prev    next >
BASIC Source File  |  1980-01-01  |  13KB  |  275 lines

  1. 10 REM ********************************************************************
  2. 20 REM *       HideFile             by            John Vandegrift         *
  3. 30 REM *                                                                  *
  4. 40 REM *  This program allows the user to modify diskette files in the    *
  5. 50 REM *  following ways.  First, the user can change a file to a normal  *
  6. 60 REM *  file, hidden file, system file or hidden/system file.  The file *
  7. 70 REM *  to be changed can be any of the above.  The second function of  *
  8. 80 REM *  this program is to allow the user to undelete files.  Although  *
  9. 90 REM *  this will undelete files, it is limited in its ability to do so.*
  10. 100 REM *  If a file is bigger than 512 bytes (1 sector), then the file    *
  11. 110 REM *  will have to be in on contiguous set of sectors, as this program*
  12. 120 REM *  doesn't know where else the sectors belonging to deleted file   *
  13. 130 REM *  were.  What this program does if a file is bigger than 512 bytes*
  14. 140 REM *  is check the sectors following the first sector of the program  *
  15. 150 REM *  to see if they are allocated.  If not, it assumes that those    *
  16. 160 REM *  sectors belong to that file and uses them.  If they are in use  *
  17. 170 REM *  then this program cannot undelete that file.  A user can also   *
  18. 180 REM *  use this to scan through the directory of a file.               *
  19. 190 REM *                                                                  *
  20. 200 REM *  Limitations:  If the diskette is double-sided, then this reads  *
  21. 210 REM *                the first 64 directory entries. The diskette in   *
  22. 220 REM *                drive A is the diskette to be read, although      *
  23. 230 REM *                provision is made for reading drive B if the user *
  24. 240 REM *                wants to add the user i/o for the drive. The      *
  25. 245 REM *                user must have 64k memory and 1 disk drive,       *
  26. 246 REM *                minimum configuration.                            *
  27. 250 REM ********************************************************************
  28. 260 CLEAR ,&H4000:KEY OFF
  29. 270 DEF SEG=0
  30. 275 GOSUB 1880
  31. 280 REM          Assembler Routine
  32. 290 REM
  33. 300 REM  This routine pokes a machine language subroutine into high memory.
  34. 310 REM  This subroutine reads and writes the diskette directory and FAT
  35. 320 REM  from/to the diskette to/from upper memory.
  36. 330 REM  The diskette buffer area starts at &hcc00 and is 3072 bytes.
  37. 340 REM  The subroutine is loaded at &hE000 and is 36 bytes.
  38. 350 REM
  39. 360 DATA &h55,&h06,&hb8,&h00,&h00
  40. 370 DATA &h8e,&hc0,&h8b,&hec,&h8b
  41. 380 DATA &h76,&h0a,&h8b,&h04,&h8a
  42. 390 DATA &he0,&hb0,&h06,&hbb,&h00
  43. 400 DATA &hcc,&hb9,&h02,&h00,&h8b
  44. 410 DATA &h76,&h08,&h8b,&h14,&hcd
  45. 420 DATA &h13,&h07,&h5d,&hca,&h04
  46. 430 DATA &h00
  47. 440 FOR I=1 TO 36:READ J:SUM=SUM+J:NEXT I
  48. 450 IF SUM<>3470 THEN CLS:PRINT "Sum = ";SUM;". Data Error!":STOP
  49. 460 RESTORE
  50. 470 FOR I=0 TO 35:READ J:POKE &HE000+I,J:NEXT I
  51. 480 SUBRT=&HE000
  52. 490 REM
  53. 500 REM         Call the routine to read FAT and Directory from diskette
  54. 510 REM         and check for single-sided format.
  55. 520 REM
  56. 530 A%=2    '2 for read or 3 for write
  57. 540 B%=0    '0 for drive A or 1 for drive B
  58. 550 CALL SUBRT (A%, B%)
  59. 560 IF PEEK(&HCC00)=&HFE THEN NOSIDES=1 ELSE NOSIDES=2
  60. 590 REM
  61. 600 REM         Master Menu
  62. 610 REM
  63. 620 REM  The user may want to follow the options in order of occurance,
  64. 630 REM  first reading the directory, then altering it and finally
  65. 640 REM  writing it back to the diskette.
  66. 650 REM
  67. 655 GOSUB 2130
  68. 660 CLS:LOCATE 2,37:PRINT "HideFile"
  69. 662 LOCATE 23,30:IF NOSIDES=1 THEN PRINT "Single-sided diskette":GOTO 670
  70. 665 PRINT "Double-sided diskette"
  71. 670 LOCATE 10,30:PRINT "1. File Directory"
  72. 680 LOCATE 11,30:PRINT "2. Alter Directory"
  73. 690 LOCATE 12,30:PRINT "3. Update Diskette"
  74. 700 LOCATE 13,30:PRINT "4. Help"
  75. 705 LOCATE 14,30:PRINT "5. Exit"
  76. 710 LOCATE 16,30:INPUT "Choice";IANS
  77. 730 ON IANS GOSUB 790,1030,750,2210,1880
  78. 735 IF IANS=5 THEN KEY ON:END
  79. 740 GOTO 660
  80. 745 REM
  81. 750 REM         Put Directory on diskette
  82. 751 REM
  83. 752 REM    This routine takes the diskette directory and FAT images
  84. 753 REM    in upper memory and writes them to the diskette.  Here
  85. 754 REM    drive A is assumed, just as it is when data is read from
  86. 755 REM    the diskette.
  87. 756 REM
  88. 760 A%=3:B%=0
  89. 770 CALL SUBRT (A%, B%)
  90. 780 RETURN
  91. 785 REM
  92. 790 REM         Display Files Routine
  93. 791 REM
  94. 792 REM    This is a simple directory function that reads the directory
  95. 793 REM    information from upper memory and displays to the user.  The
  96. 794 REM    user can use this to look at all of the directory entries.
  97. 795 REM    It will show what type of file is there, whether it has been
  98. 796 REM    deleted, or if the entry has never been used.
  99. 797 REM
  100. 800 CLS
  101. 810 FOR I=0 TO 2016 STEP 32
  102. 820 IF PEEK(I+&HD000)=&HE5 AND PEEK(I+&HD001)=246 THEN 1010
  103. 830 IF PEEK(I+&HD000)=&HE5 THEN DEL$="*del*" ELSE DEL$="     "
  104. 840 LOCATE ,15
  105. 850 FOR J=0 TO 7:PRINT CHR$(PEEK(J+I+&HD000));:NEXT J
  106. 860 PRINT ".";
  107. 870 FOR J=8 TO 10:PRINT CHR$(PEEK(J+I+&HD000));:NEXT J
  108. 880 A=PEEK(I+&HD00B)
  109. 890 IF A=0 THEN PRINT " Normal File       ";
  110. 900 IF A=2 THEN PRINT " Hidden File       ";
  111. 910 IF A=4 THEN PRINT " System File       ";
  112. 920 IF A=6 THEN PRINT " Hidden/System File";
  113. 930 MONTH$ = STR$((PEEK(I+&HD019) AND 1)*8 + ((PEEK(I+&HD018) AND 224)/32))
  114. 940 IF LEN(MONTH$)>2 THEN MONTH$=RIGHT$(MONTH$,2)
  115. 950 DAY$ = STR$(PEEK(I+&HD018) AND 31):IF LEN(DAY$)>2 THEN DAY$=RIGHT$(DAY$,2)
  116. 960 YEAR$ = RIGHT$(STR$((INT(PEEK(I+&HD019)/2))+1980),4)
  117. 970 THEDATE$=MONTH$+"/"+DAY$+"/"+YEAR$
  118. 980 SIZE=PEEK(I+&HD01C)+(PEEK(I+&HD01D)*256)+(PEEK(I+&HD01E)*65536!)
  119. 990 PRINT THEDATE$;" ";DEL$;" ";SIZE
  120. 995 IF ((I/32)+1) MOD 20 = 0 THEN GOSUB 1010:CLS
  121. 1000 NEXT I
  122. 1010 LOCATE 23,28:INPUT "Press return to continue",IANS
  123. 1020 RETURN
  124. 1025 REM
  125. 1030 REM         Alter Directory Entries Routine
  126. 1031 REM
  127. 1032 REM   Allows the user to page through the entries of the diskette
  128. 1033 REM   directory.  The user can change the file attribute from
  129. 1034 REM   Normal, Hidden, System, or Hidden/System to any of the same.
  130. 1035 REM   The user can also undelete deleted files.
  131. 1036 REM   This function does not save these changes to diskette!
  132. 1037 REM
  133. 1040 I=0
  134. 1050 CLS
  135. 1060 TITLE$=""
  136. 1070 LOCATE 2,30:PRINT "Directory Entry ";I/32+1
  137. 1080 IF PEEK(I+&HD000)=&HE5 THEN IF PEEK(I+&HD001)=246 THEN TITLE$="Unused":DEL$="":GOTO 1120 ELSE DEL$="*deleted*" ELSE DEL$=""
  138. 1090 FOR J=0 TO 7:TITLE$=TITLE$+CHR$(PEEK(J+I+&HD000)):NEXT J
  139. 1100 TITLE$=TITLE$+"."
  140. 1110 FOR J=8 TO 10:TITLE$=TITLE$+CHR$(PEEK(J+I+&HD000)):NEXT J
  141. 1120 LOCATE 10,20:PRINT TITLE$;
  142. 1130 A=PEEK(I+&HD00B)
  143. 1140 IF A=0 THEN PRINT " Normal File       ";
  144. 1150 IF A=2 THEN PRINT " Hidden File       ";
  145. 1160 IF A=4 THEN PRINT " System File       ";
  146. 1170 IF A=6 THEN PRINT " Hidden/System File";
  147. 1180 PRINT " "+DEL$
  148. 1190 LOCATE 23,10:PRINT "D - Delete toggle  F - File toggle  X - eXit  ";CHR$(75);" ";CHR$(77);" - Paging"
  149. 1200 A$=INKEY$:IF A$="" THEN 1200
  150. 1210 IF A$="X" OR A$="x" THEN RETURN
  151. 1220 IF A$="f" OR A$="F" THEN GOSUB 1280:POKE (I+&HD00B),ATTRIBUTE
  152. 1230 IF A$="d" OR A$="D" THEN GOSUB 1400:POKE (I+&HD000),LETTER1
  153. 1240 IF LEN(A$)=2 THEN A$=RIGHT$(A$,1)
  154. 1250 IF A$=CHR$(75) THEN IF I>31 THEN I=I-32
  155. 1260 IF A$=CHR$(77) THEN IF I<1985 THEN I=I+32
  156. 1270 GOTO 1050
  157. 1280 REM        Get New File Attribute
  158. 1290 LOCATE 23,10:PRINT STRING$(65,32)
  159. 1300 LOCATE 14,30:PRINT "File Attribute:"
  160. 1310 LOCATE 16,30:PRINT "1. Normal file"
  161. 1320 LOCATE 17,30:PRINT "2. Hidden file"
  162. 1330 LOCATE 18,30:PRINT "3. System file"
  163. 1340 LOCATE 19,30:PRINT "4. Hidden/System file"
  164. 1350 LOCATE 20,30:PRINT "5. Exit"
  165. 1355 LOCATE 22,30:INPUT "Choice   ";IANS
  166. 1356 IF IANS=5 THEN ATTRIBUTE=PEEK(I+&HD00B):GOTO 1380
  167. 1360 IF IANS<1 OR IANS>4 THEN LOCATE 20,35:PRINT STRING$(30,32):GOTO 1280
  168. 1370 ATTRIBUTE=(IANS-1)*2
  169. 1380 FOR K=14 TO 22:LOCATE K,30:PRINT STRING$(45,32):NEXT K
  170. 1390 RETURN
  171. 1395 REM
  172. 1400 REM        Undelete File
  173. 1401 REM
  174. 1402 REM   This routine allows the user to undelete a deleted file.
  175. 1403 REM   The size of the file is obtained from the directory and the
  176. 1404 REM   necessary number of sectors are checked following the first
  177. 1405 REM   sector of the file.  If none of the sectors following the
  178. 1406 REM   the first sector are allocated, the program assumes those
  179. 1407 REM   are the sectors belonging to the deleted program.  Otherwise,
  180. 1408 REM   it will not undelete the file!
  181. 1409 REM
  182. 1410 LOCATE 23,10:PRINT STRING$(65,32)
  183. 1420 LETTER1=PEEK(I+&HD000):IF LETTER1=&HE5 THEN 1460
  184. 1430 LOCATE 15,25:INPUT "This is not a deleted file. Press return";IANS$
  185. 1450 LOCATE 15,25:PRINT STRING$(53,32):RETURN
  186. 1460 SIZE=PEEK(I+&HD01C)+(PEEK(I+&HD01D)*256)+(PEEK(I+&HD01E)*65536!)
  187. 1470 SECTORS=INT((SIZE-1)/512)+1
  188. 1480 LOCATE 20,21:PRINT "File Size is ";SIZE;" bytes,";SECTORS;" sectors."
  189. 1490 CLUSTER = PEEK(I+&HD01A)+PEEK(I+&HD01B)*256
  190. 1500 LOCATE 21,21:PRINT "Starting Cluster is ";CLUSTER
  191. 1510 GOSUB 1600
  192. 1520 IF FLAG$="yes" THEN 1530 ELSE PRINT "There are sectors allocated after cluster ";CLUSTER;"!! Press return.";:INPUT IANS:GOTO 1580
  193. 1530 LOCATE 15,25:INPUT "Do you want to undelete this file?";IANS$
  194. 1540 IF LEFT$(IANS$,1)<>"Y" AND LEFT$(IANS$,1)<>"y" THEN 1580
  195. 1550 LOCATE 16,23:INPUT "Enter first letter for filename";IANS$
  196. 1560 LETTER1=ASC(IANS$)
  197. 1562 IF LETTER1<123 AND LETTER1>96 THEN LETTER1=LETTER1-31
  198. 1565 IF LETTER1<65 OR LETTER1>90 THEN 1530
  199. 1570 GOSUB 1680
  200. 1580 LOCATE 15,25:PRINT STRING$(53,32)
  201. 1590 LOCATE 16,25:PRINT STRING$(53,32):RETURN
  202. 1595 REM
  203. 1600 REM                Cluster's Last Stand(checks clusters)
  204. 1601 REM
  205. 1602 REM   This is the routine that checks the needed number of sectors
  206. 1603 REM   immediatly following the first sector of the file being
  207. 1604 REM   undeleted!  FLAG$ contains the indicator as to the outcome
  208. 1605 REM   of the check.
  209. 1606 REM
  210. 1608 IF NOSIDES=1 THEN RANGE=SECTORS ELSE RANGE=INT((SECTORS+1)/2)
  211. 1610 FOR INC=1 TO RANGE
  212. 1620 TEMP=INT((CLUSTER+INC-1)*1.5)
  213. 1630 IF CLUSTER MOD 2 = 1 THEN NEWCLUS=((PEEK(&HCC00+TEMP) AND 240)/16)+PEEK(&HCC00+TEMP+1)*256  ELSE NEWCLUS=PEEK(&HCC00+TEMP)+((PEEK(&HCC00+TEMP+1) AND 15)*256)
  214. 1640 IF NEWCLUS<>0 THEN FLAG$="no":GOTO 1670
  215. 1650 NEXT INC
  216. 1660 FLAG$="yes"
  217. 1670 RETURN
  218. 1675 REM
  219. 1680 REM                Cluster's Last Stand(updates clusters)
  220. 1681 REM
  221. 1682 REM   This routine reallocates the sectors following the first sector.
  222. 1683 REM   Appendix C of the DOS Manual gives the technique for accessing
  223. 1684 REM   this information.
  224. 1685 REM
  225. 1688 IF NOSIDES=1 THEN RANGE=SECTORS-1 ELSE RANGE=INT((SECTORS+1)/2)-1
  226. 1690 FOR INC=1 TO RANGE
  227. 1700 TEMP=INT((CLUSTER+INC-1)*1.5)
  228. 1710 IF (CLUSTER+INC-1) MOD 2 = 1 THEN BYTE1=(PEEK(&HCC00+TEMP) AND 15) + (((CLUSTER + INC) AND 15)*16):BYTE2=INT((CLUSTER+INC)/16):GOTO 1730
  229. 1720 BYTE1=(CLUSTER+INC) AND 255:BYTE2=(PEEK(&HCC00+TEMP+1) AND 240) + INT((CLUSTER+INC)/256)
  230. 1730 POKE (&HCC00+TEMP),BYTE1:POKE (&HCE00+TEMP),BYTE1
  231. 1740 POKE (&HCC00+TEMP+1),BYTE2:POKE (&HCE00+TEMP+1),BYTE2
  232. 1750 NEXT INC
  233. 1760 REM                poke end of file
  234. 1770 TEMP=INT((CLUSTER+RANGE)*1.5)
  235. 1780 IF (CLUSTER+RANGE) MOD 2 = 1 THEN BYTE1=(PEEK(&HCC00+TEMP) AND 15) + 240:BYTE2=255:GOTO 1800
  236. 1790 BYTE1=255:BYTE2=(PEEK(&HCC00+TEMP+1) AND 240) + 15
  237. 1800 POKE (&HCC00+TEMP),BYTE1:POKE (&HCE00+TEMP),BYTE1
  238. 1810 POKE (&HCC00+TEMP+1),BYTE2:POKE (&HCE00+TEMP+1),BYTE2
  239. 1820 RETURN
  240. 1880 REM
  241. 1890 REM                Ending Routine
  242. 1895 REM
  243. 2000 CLS
  244. 2010 A$="HideFile":B$="b":C$="y":D$="John Vandegrift":COUNT=10
  245. 2020 GOSUB 2060
  246. 2030 A$="        ":B$=" ":C$=" ":D$="               ":COUNT=9
  247. 2040 GOSUB 2060
  248. 2050 LOCATE 23,1:RETURN
  249. 2060 FOR I=1 TO COUNT
  250. 2070 LOCATE I,37:PRINT A$;
  251. 2080 LOCATE 12,4*I:PRINT B$;
  252. 2090 LOCATE 12,81-(4*I):PRINT C$;
  253. 2100 LOCATE 24-I,33:PRINT D$;
  254. 2110 NEXT I
  255. 2120 RETURN
  256. 2130 REM
  257. 2140 REM                Move Header back to top
  258. 2150 REM
  259. 2160 FOR I=14 TO 13 STEP -1:LOCATE I,33:PRINT SPACE$(15);:NEXT I
  260. 2170 A$="HideFile":FOR I=12 TO 3 STEP -1
  261. 2180 LOCATE I-1,37:PRINT A$;
  262. 2190 LOCATE I,37:PRINT SPACE$(8);
  263. 2195 NEXT I
  264. 2200 RETURN
  265. 2210 REM
  266. 2220 REM                Help Routine
  267. 2230 REM
  268. 2240 CLS:LOCATE 4,10:PRINT "(1)  File Directory lists the directory of the diskette."
  269. 2250 LOCATE 7,10:PRINT "(2)  Alter Directory allows the user to change directory attributes."
  270. 2260 LOCATE 10,10:PRINT "(3)  Save Changes is the only way to write changes (2) to the diskette."
  271. 2270 LOCATE 13,10:PRINT "(4)  EXIT ALLOWS THE USER TO EXIT THE PROGRAM."
  272. 2280 LOCATE 16,10:PRINT "(5)  Help is this screen."
  273. 2290 LOCATE 19,10:INPUT "Press return to continue....",IANS
  274. 2300 RETURN
  275.